package core

import (
	"downloader/internal/crawler"
	"downloader/internal/downloader"
	"downloader/internal/protocols"
	"fmt"
	"strings"
)

// Downloader 提供直接调用的下载功能
type Downloader struct {
	config *downloader.Config
}

// NewDownloader 创建一个新的下载器实例
func NewDownloader(config *downloader.Config) *Downloader {
	if config == nil {
		// 由于 downloader.DefaultConfig() 返回的已经是指针类型，无需再取地址
		config = downloader.DefaultConfig()
	}
	return &Downloader{config: config}
}

// Download 直接下载指定URL的文件
func (d *Downloader) Download(url string) error {
	protocol, err := detectProtocol(url)
	if err != nil {
		return err
	}

	dl, err := downloader.New(protocol, d.config)
	if err != nil {
		return err
	}
	return dl.Download(url)
}

// Crawler 提供直接调用的爬虫功能
type Crawler struct {
	config crawler.Config
}

// NewCrawler 创建一个新的爬虫实例
func NewCrawler(config *crawler.Config) *Crawler {
	if config == nil {
		config = &crawler.Config{
			MaxDepth: 3,
			URLFile:  "urls.txt",
		}
	}
	return &Crawler{config: *config}
}

// Crawl 开始爬取指定URL
func (c *Crawler) Crawl(url string) error {
	crawler, err := crawler.New(url, c.config)
	if err != nil {
		return err
	}

	if err := crawler.Start(); err != nil {
		return err
	}

	return crawler.Finalize()
}

// 检测URL协议类型
func detectProtocol(url string) (string, error) {
	// 如果是m3u8文件，使用http协议
	if strings.HasSuffix(url, ".m3u8") {
		return "http", nil
	}

	protocol := protocols.DetectProtocol(url)
	if !protocols.IsSupportedProtocol(protocol) {
		return "", fmt.Errorf("不支持的协议类型: %s", protocol)
	}
	return protocol, nil
}
